import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
// import { getToken } from '@/utils/auth'

// 创建axios实例(service里面带前缀基地址和超时时间)
const service = axios.create({
  // 知识点1: nodejs+webpack下的环境变量
  // process.env -> nodejs环境下的内置全局变量(任意处使用)
  // 效果: 获取敲击命令, 执行时的 "环境变量"
  // yarn dev(开发环境启动)-> process.env上会被nodejs+webpack挂载.env.development文件里的变量值到这里
  // yarn build:prod(打包准备放入生产环境) -> process.env上会被挂载.env.production文件里的变量值到这里
  // 作用: 根据敲击的命令, 自动加载对应不同的环境变量, 开发时是一个基地址, 上线时是一个基地址
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 50000 // 网络请求5秒后还没得到响应, 则判定超时, 报错
})
// 请求拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
  }
  return config
//   const token = store.getters.token
//   if (token) {
//     // 把token存到请求头上
//     config.headers.Authorization = `Bearer ${token}`
//   }
//   return config
}, err => {
  return Promise.reject(err)
})

// 响应拦截器
// service.interceptors.response.use(response => {
//   // axios默认有一层data
//   const { message, succuess, data } = response.data
//   if (succuess) {
//     return data
//   } else {
//     Message.error(message)
//     return Promise.reject(new Error(message))
//   }
//   //   const { message, success } = response.data
//   //   // 如果成功了 返回成功的回调
//   //   if (success) {
//   //     return response.data
//   //   } else {
//   //     Message.error(message)
//   //     return Promise.reject(message)
//   //   }
//   // }, error => {
//   //   // console.dir(error)
//   //   Message.error(error.response.data.message)
//   //   // 如果响应转态码是100002是token超时
//   //   if (error.response.data.code === '100002') {
//   //     // 清除token
//   //     // 直接commit调用mutainations的方法
//   //     store.commit('user/REMOVE_TOKEN')
//   //     // 清除用户信息
//   //     store.commit('user/REMOVE_USER')
//   //     // 跳转到登录页  这儿也要带入未遂地址
//   //     router.replace(`/login?redirect${encodeURIComponent(router.currentRoute.fullPath)}`)
//   //   }

// //   return Promise.reject(error)
// }, error => {
//   Message.error(error.message)
//   return Promise.reject(error)
// })
// 响应拦截器
service.interceptors.response.use(response => {
  // axios默认加了一层data
  const { success, message, data } = response.data
  //   要根据success的成功与否决定下面的操作
  if (success) {
    // Message.success(message)
    return data
  } else {
    // 业务已经错误了 还能进then ? 不能 ！ 应该进catch
    Message.error(message) // 提示错误消息
    return Promise.reject(new Error(message))
  }
}, error => {
  // token响应超时处理
  if (error.response && error.response.data && error.response.data.code === '10002') {
    //  清除token
    // 清除用户信息
    store.dispatch('user/logoutActions')
    // 跳转到登录页
    router.push('/login')
    // 给用户提示信息
  } else {
    Message.error(error.message) // 提示错误信息
  }
  return Promise.reject(error) // 返回执行错误 让当前的执行链跳出成功 直接进入 catch
})
export default service
